package br.inf.ufg.clinica.persistencia;

import br.inf.ufg.clinica.model.Empresa;
import br.inf.ufg.clinica.model.Paciente;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

public class PacienteGravacao implements ServiceHelper<Paciente> {

    private final String ARQUIVO = "paciente.csv";
    private CSVToFile gerenciadorDeArquivo;

    public PacienteGravacao() {
        gerenciadorDeArquivo = new CSVToFile(ARQUIVO);
    }

    @Override
    public boolean gravarObjeto(Paciente paciente) {
        if (!gerenciadorDeArquivo.contem(paciente.getId())) {
            return gerenciadorDeArquivo.gravarLinha(toLine(paciente));
        } else {
            return false;
        }
    }

    @Override
    public void gravarObjetos(List<Paciente> paciente) {
        for (Paciente cliente : paciente) {
            this.gravarObjeto(cliente);
        }
    }

    @Override
    public Paciente getObjetoPorId(int id) {
        String linha = gerenciadorDeArquivo.getLinhaPorId(id);
        if (linha != null) {
            Paciente resultado = getObject(linha);
            return resultado;
        } else {
            return null;
        }

    }

    @Override
    public ArrayList<Paciente> getTodosObjetos() {
        List<String> listaObjetos = gerenciadorDeArquivo.getLinhas();
        ArrayList<Paciente> resultado = new ArrayList<>();
        for (String paciente : listaObjetos) {
            Paciente listaPaciente = getObject(paciente);
            resultado.add(listaPaciente);
        }
        return resultado;
    }

    @Override
    public boolean remove(Paciente paciente) {
        return gerenciadorDeArquivo.removerLinha(paciente.getId());
    }

    private String toLine(Paciente i) {
        StringBuilder sb = new StringBuilder();

        sb.append(i.getId());
        sb.append(ServiceHelper.SEPARADOR);
        sb.append(i.getNome());
        sb.append(ServiceHelper.SEPARADOR);
        sb.append(i.getCpf());
        sb.append(ServiceHelper.SEPARADOR);
        sb.append(i.getEndereco());
        sb.append(ServiceHelper.SEPARADOR);
        sb.append(i.getTelefone());
        sb.append(ServiceHelper.SEPARADOR);
        sb.append(i.isAtivo());
        sb.append(ServiceHelper.SEPARADOR);
        sb.append(i.getData_ativacao());
        sb.append(ServiceHelper.SEPARADOR);
        sb.append(i.getPessoa_contato());
        sb.append(ServiceHelper.SEPARADOR);
        sb.append(i.getObservacao());

        return sb.toString();
    }

    private Paciente getObject(String line) {
        String[] paciente = line.split(
                String.valueOf(ServiceHelper.SEPARADOR));

        String observacao = paciente[8];
        boolean ativo = Boolean.parseBoolean(paciente[1]);
        String data_ativacao = paciente[5];
        String pessoa = paciente[7];
        int id = Integer.parseInt(paciente[0]);
        String cpf = paciente[2];
        String nome = paciente[1];
        String endereco = paciente[3];
        String telefone = paciente[4];
        
        EmpresaGravacao empresaBD = new EmpresaGravacao();
        Empresa empresa = empresaBD.getObjetoPorId(Integer.parseInt(paciente[0]));

        Paciente resultado = new Paciente(observacao, ativo, data_ativacao, pessoa, empresa, id, cpf, nome, endereco, telefone);
        return resultado;
    }

    public void imprimeListaPaciente(ArrayList<Paciente> paciente) {

        System.out.println("LISTA DE PACIENTES: \n");
        for (Paciente paciente1 : paciente) {
            System.out.println("ID: " + paciente1.getId() + "\t Nome: " + paciente1.getNome() + "\n");
        }
        System.out.println("**************************************************\n");

    }

}
